package com.itheima.HomeWork_day14;

//阻塞队列实现等待唤醒机制

/*
测试类(Demo)：里面有main方法，main方法中的代码步骤如下

创建阻塞队列对象

创建生产者线程和消费者线程对象,构造方法中传入阻塞队列对象

分别开启两个线程
 */
import java.util.concurrent.ArrayBlockingQueue;

public class StopTest04 {
    public static void main(String[] args) {

        ArrayBlockingQueue<String> arr=new ArrayBlockingQueue(1);

        Cook c=new Cook(arr);
        Food f=new Food(arr);

        c.start();
        f.start();

    }
}

/*
生产者类(Cooker)：实现Runnable接口，重写run()方法，设置线程任务

1.构造方法中接收一个阻塞队列对象

2.在run方法中循环向阻塞队列中添加包子

3.打印添加结果
 */
class Cook extends  Thread{
    private ArrayBlockingQueue<String> arr;
    public Cook(ArrayBlockingQueue<String> arr) {
        this.arr=arr;
    }

    @Override
    public void run() {

        while (true) {
            try {
                Thread.sleep(100);
                arr.put("面包");
                System.out.println("面包师放了一个面包");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

/*
消费者类(Foodie)：实现Runnable接口，重写run()方法，设置线程任务

1.构造方法中接收一个阻塞队列对象

2.在run方法中循环获取阻塞队列中的包子

3.打印获取结果
 */
class Food extends Thread{
    private ArrayBlockingQueue<String> arr;
    public Food(ArrayBlockingQueue<String> arr) {
        this.arr=arr;
    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(100);
                String take = arr.take();
                System.out.println("吃货拿走了"+take);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}